home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 37
/
Aminet 37 (2000)(Schatztruhe)[!][Jun 2000].iso
/
Aminet
/
dev
/
cross
/
Avr.lha
/
Atmel
/
Asm
/
examples
/
tune.asm
< prev
next >
Wrap
Assembly Source File
|
1999-10-10
|
2KB
|
105 lines
;Example code which plays a tune on the output compare pin of AT90S
;device, running with an 8MHz crystal.
.include "/includes/io2313.h"
; Equates for each musical note, eg o2a is octave 2, A
o2a equ 142
o2b equ 127
o2c equ 120
o2d equ 107
o2e equ 95
o2f equ 89
o2fs equ 87 ;F#
o2g equ 80
o3a equ 71
o3b equ 63
o3c equ 60
o3d equ 53
o3e equ 48
o3f equ 45
o3g equ 40
;Output compare pin, output.
sbi DDRB,3
ldi R16,$40
out TCCR1A,R16 ;Toggle OC pin on compare (Piezo).
ldi R16,$0B ;00001100 clear counter on match, clk/8
out TCCR1B,R16
RESTART:
ldi R30,(TUNE*2)&255 ;Load the start of the lookup table into Z (R30, R31)
ldi R31,(TUNE*2)>8
clr R16
L1:
out OCR1AH,R16 ;Delay between notes.
out OCR1AL,R16
ldi R18,50
L3: ;Short software delay.
dec R18
brne L3
dec R19
brne L3
lpm ;Get note from lookup table, store in R0.
ld R1,Z+ ;Just increment Z by 1
mov R17,R0
cpi R17,0
breq RESTART ;If the note was 0, end of tune.
lpm ;Get note duration.
ld R1,Z+
mov R20,R0
clr R18 ;clear the counter
out TCNT1H,R18
out TCNT1L,R18
out OCR1AH,R16 ;Load in new note
out OCR1AL,R17
L2: ;note delay
dec R18
brne L2
dec R19
brne L2
dec R20
brne L2
rjmp L1
; Tune lookup table.
TUNE: ;Note, Duration
.db o2d,7
.db o2c,7
.db o2b,10
.db o2d,10
.db o2d,10
.db o2d,10
.db o2e,10
.db o2d,20
.db o2c,10
.db o2b,15
.db o2d,5
.db o2g,15
.db o3a,5
.db o3b,25
.db o3b,10
.db o3b,10
.db o2d,10
.db o2d,10
.db o3b,10
.db o3b,10
.db o3a,20
.db o2g,10
.db o2fs,15
.db o2g,7
.db o3a,15
.db o3b,7
.db o3a,20
.db 0 ;end marker